// 公共类型定义

import rpg_component from "../../../component/rpg_component";
import { Attribute_base, EffectClassType, LogType, PassiveTriggerType, SkillType, TargetType, attackKey, effectKey, ConditionType, ConditionOperator } from "../../../shared/face/enums";

export interface CharacterAttributes {
  strength?: number;
  agility?: number;
  intelligence?: number;
  [key: string]: number | undefined;
}
// 用户 在bot 连接 组件
export interface IBodyCreateConfig {
  url: string;
  emoji: string;
  name: string;
  level: number;
  skill: any[];
}
export interface SkillEffect {
  damage?: number;
  cooldown?: number;
  [key: string]: number | undefined;
}
export interface killLog {
  // 归属的用户iD
  masterId: string;
  // 发起的单位
  unit: rpg_component;
  // 目标单位
  target: rpg_component;
  // 回合
  round: number;
  // 技能名称
  skillName: string;
}

// 配置化触发条件系统
export interface TriggerCondition {
  type: ConditionType;
  operator?: ConditionOperator;
  value: number | string;
  target?: 'self' | 'ally' | 'enemy' | 'all';
  attribute?: string; // 属性名称
  skillId?: string; // 技能ID（用于技能冷却检查）
  probability?: number; // 概率值（0-1）
}

export interface TriggerConditionGroup {
  conditions: TriggerCondition[];
  logic: 'AND' | 'OR'; // 条件组内的逻辑关系
}

export interface TriggerConditionConfig {
  groups: TriggerConditionGroup[];
  logic: 'AND' | 'OR'; // 条件组之间的逻辑关系
}

// RPG核心类型与枚举


/**
 * Buff配置接口
 * @description 定义技能附加的Buff效果配置
 */
export interface BuffConfig {
  /** 
   * Buff唯一标识符
   * @description 用于在系统中唯一标识此Buff，建议使用大写字母和下划线
   * @example 'DEFENSE_BUFF', 'POISON_DOT'
   */
  id: string;
  
  /** 
   * Buff显示名称
   * @description 在游戏中显示给玩家看的Buff名称
   * @example '防御强化', '中毒效果'
   */
  name: string;
  
  /** 
   * 日志类型
   * @description 决定Buff在战斗日志中的显示类型
   * @values LogType.伤害, LogType.治疗, LogType.护盾, LogType.状态
   */
  logType: LogType;
  
  /** 
   * Buff持续时间
   * @description Buff持续的回合数，-1表示永久持续
   * @example 3 - 持续3回合
   * @example -1 - 永久持续
   */
  duration: number;
  
  /** 
   * 效果类型
   * @description 决定Buff的主要效果类型
   * @values '属性' - 修改属性, '状态' - 状态效果, '持续伤害' - 持续伤害, '护盾' - 护盾效果
   */
  effectType: '属性' | '状态' | '持续伤害' | '护盾';
  
  /** 
   * 属性修改配置
   * @description 定义Buff对属性的修改效果，仅在effectType为'属性'时使用
   * @optional 可选字段
   * @example { [Attribute_base.物理攻击]: 10 } - 物理攻击力增加10
   * @example { [Attribute_base.魔法防御]: -5 } - 魔法防御力减少5
   */
  attributeModifiers?: {
    [key in Attribute_base]?: number;
  };
  
  /** 
   * 状态效果配置
   * @description 定义Buff的状态效果，仅在effectType为'状态'时使用
   * @optional 可选字段
   * @example [{ type: '眩晕', value: 1 }] - 造成眩晕状态
   * @example [{ type: '沉默', value: 2 }] - 造成沉默状态2回合
   */
  statusEffects?: {
    /** 状态类型名称 */
    type: string;
    /** 状态效果数值 */
    value: number;
  }[];
  
  /** 
   * 持续伤害配置
   * @description 定义Buff的持续伤害效果，仅在effectType为'持续伤害'时使用
   * @optional 可选字段
   * @example 20 - 每回合造成20点持续伤害
   */
  damage?: number;
  
  /** 
   * 伤害类型
   * @description 持续伤害的类型，仅在effectType为'持续伤害'时使用
   * @optional 可选字段
   * @example '魔法' - 魔法持续伤害
   * @example '物理' - 物理持续伤害
   */
  damageType?: string;
  
  /** 
   * 护盾数值
   * @description 护盾的吸收伤害数值，仅在effectType为'护盾'时使用
   * @optional 可选字段
   * @example 100 - 吸收100点伤害
   */
  shieldValue?: number;
  
  /** 
   * 结束效果
   * @description Buff结束时触发的效果
   * @optional 可选字段
   * @example '移除护盾' - 结束时移除护盾
   * @example '造成伤害' - 结束时造成伤害
   */
  endEffect?: string;
}
/**
 * Buff运行时接口
 * @description Buff在战斗中的运行时状态
 */
export interface Buff {
  /** Buff唯一标识符 */
  id: string;
  /** Buff显示名称 */
  name: string;
  /** 日志类型 */
  logType: LogType;
  /** Buff持续时间 */
  duration: number;
  /** Buff效果函数 */
  effect: any;
  /** Buff结束效果函数 */
  endEffect?: any;
}
/**
 * 技能接口
 * @description 定义技能的基础配置和属性
 */
export interface Skill {
  /** 
   * 技能品质等级
   * @description 决定技能的稀有度和强度，影响技能获取难度
   * @values quality.C (普通), quality.B (稀有), quality.A (史诗), quality.S (传说), quality.SSR (神话)
   */
  quality: any;
  
  /** 
   * 技能唯一标识符
   * @description 用于在系统中唯一标识此技能，建议使用大写字母和下划线
   * @example 'FLAME_ENHANCEMENT', 'SOUL_DRAIN'
   */
  id: string;
  
  /** 
   * 技能显示名称
   * @description 在游戏中显示给玩家看的技能名称
   * @example '火焰强化', '灵魂吸取'
   */
  name: string;
  
  /** 
   * 技能数据数组
   * @description 定义技能的具体数值和效果参数，每个元素对应一个效果
   * @note 数组长度必须与 effect 数组长度相同
   */
  data: any[];
  
  /** 
   * 技能效果函数数组
   * @description 定义技能产生的效果函数
   * @note 数组长度必须与 data 数组长度相同
   */
  effect: any;
  
  /** 
   * 技能冷却回合数
   * @description 使用技能后需要等待的回合数，0表示无冷却
   * @example 2 - 使用后需要等待2回合才能再次使用
   * @example 0 - 无冷却，可以连续使用
   */
  cooldown: number;
  
  /** 
   * 技能描述文本
   * @description 在技能详情界面显示的描述文字，支持动态变量替换
   * @example '对目标造成魔法伤害，每次使用后攻击倍率永久提升'
   */
  desc: string;
  
  /** 
   * 触发条件配置
   * @description 定义被动技能的触发条件
   * @optional 可选字段
   */
  triggerConditionConfig?: any;
  
  /** 
   * 技能分类类型
   * @description 决定技能的主要功能和效果类型
   * @values EffectClassType.攻击型, EffectClassType.防御型, EffectClassType.治疗型, EffectClassType.全能型
   */
  classType: EffectClassType;
  
  
  /** 
   * 技能类型
   * @description 决定技能的使用方式和触发条件
   * @values SkillType.主动技能, SkillType.被动技能, SkillType.光环技能
   */
  type: SkillType;
  
  /** 
   * 技能范围
   * @description 定义技能的作用范围
   * @optional 可选字段
   * @example [1] - 单体技能
   * @example [1, 2] - 可攻击1-2个目标
   */
  range?: number[];
  
  /** 
   * 每场战斗只能使用一次
   * @description 设置为true时，每场战斗只能使用一次
   * @optional 可选字段，默认为false
   */
  onceBattle?: boolean;
  
  /** 
   * 被动触发类型
   * @description 定义被动技能的触发条件
   * @optional 可选字段，仅在type为被动技能时使用
   * @values PassiveTriggerType.回合开始, PassiveTriggerType.受到伤害, PassiveTriggerType.造成伤害
   */
  triggerType?: PassiveTriggerType[];
  
  /** 
   * 技能目标类型数组
   * @description 定义技能可以作用的目标类型
   * @values TargetType.敌方, TargetType.友方, TargetType.自身, TargetType.全体
   * @example [TargetType.敌方] - 只能对敌人使用
   * @example [TargetType.友方, TargetType.自身] - 可以对友军和自己使用
   */
  targetType: TargetType[];
  
  /** 
   * 移除区域效果
   * @description 定义技能移除区域效果的行为
   * @optional 可选字段
   */
  removeAreaEffect?: any;
  
}
/**
 * 支持buff配置的技能接口
 * @description 扩展了基础技能接口，支持Buff配置和字符串效果类型
 */
export interface _Skill extends Omit<Skill, 'effect'> {
  /** 
   * 技能效果类型数组
   * @description 定义技能产生的效果类型，使用字符串标识符
   * @note 数组长度必须与 data 数组长度相同
   * @values effectKey.伤害类_物理伤害, effectKey.伤害类_魔法伤害, effectKey.治疗类_生命恢复
   * @example [effectKey.伤害类_物理伤害] - 造成物理伤害
   * @example [effectKey.治疗类_生命恢复] - 恢复生命值
   */
  effect: string[];
  
  /** 
   * Buff配置数组
   * @description 定义技能附加的Buff效果，可选字段
   * @optional 不设置则无Buff效果
   * @example 见 BuffConfig 接口定义
   */
  buffs?: BuffConfig[];
  
  /** 
   * 技能最大等级
   * @description 技能可以达到的最高等级，影响技能升级上限
   * @optional 可选字段，默认为10
   * @example 10 - 最高10级
   * @example 15 - 最高15级
   * @example 20 - 最高20级
   */
  maxLevel?: number;
}

/**
 * 活跃buff接口
 * @description Buff在战斗中的活跃状态
 */
export interface ActiveBuff {
  /** Buff对象 */
  buff: Buff;
  /** Buff数据 */
  data: any;
  /** 剩余持续时间 */
  remainingDuration: number;
  /** 叠加层数 */
  stackCount: number;
  /** 目标单位 */
  target: rpg_component;
  /** 使用标签 */
  useTag: rpg_component;
}

/**
 * 技能数据接口
 * @description 技能的基础数据信息
 */
export interface SkillData { 
  /** 技能ID */
  skillId: string; 
  /** 冷却时间 */
  cooldown: number 
}

/**
 * 效果函数接口
 * @description 定义技能或Buff的效果函数
 */
export interface Effect {
    /**
     * 效果函数
     * @param attacker 攻击者/施法者
     * @param target 目标单位
     * @param self 技能或Buff对象
     * @param stackCount 叠加层数
     * @param index 效果索引
     * @param SkillData 技能数据
     * @returns 效果执行结果
     */
    (attacker: rpg_component, target: rpg_component, self: Skill | Buff, stackCount: number, index:number,SkillData: { [key: string]: any }): any;
}

/**
 * 技能使用接口
 * @description 记录玩家技能的使用状态和成长数据
 */
export interface SkillUse {
  /** 
   * 技能ID
   * @description 对应技能配置中的id字段
   */
  skillId: string;
  
  /** 
   * 技能重命名
   * @description 玩家为技能自定义的名称
   * @optional 可选字段
   * @example '我的火焰', '超级攻击'
   */
  reName?: string;
  
  /** 
   * 当前冷却时间
   * @description 技能当前的剩余冷却回合数
   * @optional 可选字段
   * @example 2 - 还需要2回合才能使用
   * @example 0 - 可以立即使用
   */
  cooldown?: number;
  
  /** 
   * 技能等级
   * @description 技能的当前等级，影响技能效果强度
   * @optional 可选字段，默认为1
   * @example 1 - 1级技能
   * @example 5 - 5级技能
   */
  level?: number;
  
  /** 
   * 技能最大等级
   * @description 技能可以达到的最高等级
   * @optional 可选字段，默认为10
   * @example 10 - 最高10级
   */
  maxLevel?: number;
  
  /** 
   * 技能永久提升记录
   * @description 记录技能使用后的各种永久提升效果
   * @optional 可选字段
   * @example { damage: 5 } - 伤害永久提升5点
   * @example { attRange: 0.3 } - 攻击倍率永久提升0.3
   * @example { cooldown: 1.5 } - 冷却时间永久减少1.5回合
   */
  permanentBoosts?: {
    [key: string]: number; // 记录各种永久提升，如 damage: 5 表示伤害永久提升5点
  };
  
  /** 
   * 技能使用次数
   * @description 记录技能的总使用次数
   * @optional 可选字段，默认为0
   * @example 25 - 已使用25次
   */
  useCount?: number;
  
  /** 
   * 技能描述
   * @description 自定义的技能描述文本，优先于reName显示
   * @optional 可选字段
   * @example '我的火焰魔法', '超级攻击技能'
   */
  desc?: string;
}
